﻿namespace CamlQueryCreator.Common
{
    /// <summary>
    /// Построитель CAML запросов.
    /// </summary>
    public class CamlBuilder : CamlBase
    {
        /// <summary>
        /// Текст построенного запроса.
        /// </summary>
        internal string Query
        {
            get { return GetQuery(); }
        }

        /// <summary>
        /// Построитель CAML запросов.
        /// <para>Конструктор.</para>
        /// </summary>
        internal CamlBuilder() : base(null)
        {
        }

        #region Overrides of CamlBase

        /// <summary>
        /// Формирует запрос на основе итогового дочернего запроса и возвращает результат.
        /// </summary>
        protected override string GetQuery(string childQuery)
        {
            return childQuery;
        }

        #endregion

        /// <summary>
        /// Фильтр.
        /// <para>В подзапросах фильтра допустимо указание пустых значений (Null или <see cref="string.Empty"/>). В этом случае итоговый запрос будет упрощен.</para>
        /// <para>Например, запрос вида And(i=>i.Eq(fieldInfo1, value1),i=>i.Eq(fieldInfo2, value2) возвратит Eq(fieldInfo1, value1) в случае, когда value2==Null.</para>
        /// </summary>
        public ICamlConnector Where()
        {
            return new CamlConnectorWhere(this);
        }

        /// <summary>
        /// Сортировка.
        /// </summary>
        public CamlOrderMainElement OrderBy(IListFieldInfoBase fieldInfo, bool isAscending = true)
        {
            return new CamlOrderMainElement(this, fieldInfo, isAscending);
        }

        /// <summary>
        /// Сортировка.
        /// </summary>
        public CamlOrderMainElement OrderBy(string fieldName, bool isAscending = true)
        {
            return new CamlOrderMainElement(this, fieldName, isAscending);
        }
    }
}
